iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0

CLI 工具

moleculer-cli[2] 是一個命令列工具,可以幫助我們開發或測試。

安裝

npm install -g moleculer-cli

指令

Init

init 指令就如同蓋房子的鷹架,可以快速搭建一個新的 Moleculer 專案。

$ moleculer init project my-project

這個指令會下載 Moleculer 樣板[3],在執行 CLI 程式的過程中,會請您根據一些問題需求輸入設定,然後在 ./my-project 目錄下生成新的專案。

回答檔案

你可以將問題需求的答案寫到一個 JSON 檔案,然後透過 --answers 引數來讀取它。這在建構程式化的專案生成是很有幫助的。

$ moleculer init project my-project --answers ./answers.json

answers.json

{
    "apiGW": true,
    "needTransporter": true,
    "needCacher": true,
    "dbService": true,
    "metrics": true,
    "tracing": true,
    "docker": true,
    "lint": true
}

停用安裝依賴

你可以設定 --no-install 引數來停止自動使用 npm 來安裝依賴套件。這在建構程式化的專案生成是很有幫助的。

$ moleculer init project my-project --answers ./answers.json --no-install

官方樣板

Moleculer 官方有許多關於 moleculer-template 樣板的主題[4] 。

  • project[3] - 生成一個通用的 Moleculer 基礎專案。當你想要建立基於 Moleculer 框架的新專案時使用。
    • 樣本服務 ( greeter )
    • 官方 API 閘道器 (可選)
    • Docker 與 Docker Compose 檔案 (可選)
    • 測試與覆蓋 (Jest[5])
    • Lint 工具 (ESLint[6])
$ moleculer init project my-project
  • nano[7] - 單一微服務的小型專案樣板。當你想要建立一個微服務,並透過 Transporter 連線到其它的服務。
    • 樣本服務 ( greeter )
    • Docker 與 Docker Compose 檔案 (可選)
    • 測試與覆蓋 (Jest[5])
    • Lint 工具 (ESLint[6])
    • 最小的 Docker 配置
$ moleculer init nano my-nano-project
  • module[8] - 生成一個新的 Moleculer 模組專案。當你想要建立一個 Moleculer 框架的模組。
    • 空的服務架構
    • 範例架構
    • 說明架構
    • 測試與覆蓋 (Jest[5])
    • Lint 工具 (ESLint[6])
$ moleculer module nano my-nano-project

使用客製化樣板

$ moleculer init username/repo my-project

你可以使用原始碼代管平台的客製化樣板來建立專案。它可以使用速記並透過 download-git-repo [9] 來下載。 例如 owner/name (Github) 、 gitlab:owner/namebitbucket:owner/name ,也可以指定標籤或分支 username/repo#branch

本地樣板

除了使用原始碼代管平台的樣板外,你也可以使用本地檔案來載入樣板。

$ moleculer init ./path/to-custom-template my-project

樣板別名

你可以註冊別名並且設定其相對應的 Repo ,就可以很容易的透過別名來使用客製化樣板。

$ moleculer alias-template myAlias somegithubuser/reponame
$ moleculer alias-template otherAlias ./path/to/some-local/custom/template

$ moleculer init myAlias my-project

所有註冊的樣板別名都會被儲存在使用者目錄的 JSON 檔案 ~/.moleculer-templates.json ,你也可以手動編輯它。

建立客製化樣板

Moleculer 模板是由一個 meta.js 文件與一個 template 目錄組成的。

meta.js 會輸出一個函數,該函數會返回一個物件,物件中會定義關於 Moleculer CLI 的初始化介面。該函數會帶著一個 values 的引數,提供由 CLI 傳入的外部參數值。該物件有以下幾個鍵值說明如下:

  • questions 屬性是一個物件陣列,用來定義在初始化過程中的問題。這些物件是使用 Inquirer.js 處理的。收集到的資料會儲存於 Metalsmith 的 metadata 物件中。
  • metalsmith 屬性可以讓你在轉換過程中根據不同點執行客製化程式。其中 before 函數會在轉換之前執行,而 after 函數會在轉換完畢後執行,最後 complete 函數會在轉換運行且檔案都被複製到目標目錄後才執行。這些 metalsmith 函數都會接收到一個 metalsmith 引數,它提供了一個參考自 Metalsmith [11] 的物件。你可以利用它來呼叫 metalsmith.metadata() ,然後在 Meta 資料物件上增加或修改屬性用於後續的轉換。
  • filters 屬性的結構是一個路徑的鍵值會匹配一個問答 name 值。當問答變數的值為 false 時,在轉換過程中將會忽略該路徑,這些檔案就不會加入到正在初始化的項目中。
  • completeMessage 屬性為多行字串,可以在初始化完畢後顯示一些說明資訊。

template 是一個樣板檔案目錄,它使用 Handlebars [12] 語意樣板來轉換並複製到目標目錄。 Handlebars 會從 Metalsmith 的 metadata 物件屬性內容來作為原始碼的替換字串。另外也可以用來轉換檔案名稱。

Start

start 指令會在本地啟動一個 ServiceBroker 並且切換到 REPL 模式。

$ moleculer start

選項:

# 顯示版本號
--version     Show version number                                    [boolean]
# 顯示說明
--help        Show help                                              [boolean]
# 由檔案讀取配置
--config, -c  Load configuration from a file            [string] [default: ""]
# 命名空間
--ns          Namespace                                 [string] [default: ""]
# Log 等級
--level       Logging level                         [string] [default: "info"]
# 節點 ID
--id          NodeID                                  [string] [default: null]
# 啟用 hot-reload
--hot, -h     Enable hot-reload                     [boolean] [default: false]
# 客製化 REPL 命令檔 mask
--commands    Custom REPL command file mask (e.g.: ./commands/*.js)
                                                      [string] [default: null]

Connect

connect 指令會在啟動一個 ServiceBroker 連線到 Transporter 伺服器,並且切換到 REPL 模式。

# 使用 TCP transporter 連線
$ moleculer connect

# 連線到 NATS
$ moleculer connect nats://localhost:4222

# 連線到 Redis
$ moleculer connect redis://localhost

# 連線到 MQTT
$ moleculer connect mqtt://localhost

# 連線到 AMQP
$ moleculer connect amqp://localhost:5672

# 從配置檔讀取選項
$ moleculer connect --config ./moleculer.config.js

選項:

# 顯示版本號
--version     Show version number                                    [boolean]
# 顯示說明
--help        Show help                                              [boolean]
# 由檔案讀取配置
--config, -c  Load configuration from a file            [string] [default: ""]
# 命名空間
--ns          Namespace                                 [string] [default: ""]
# Log 等級
--level       Logging level                         [string] [default: "info"]
# 節點 ID
--id          NodeID                                  [string] [default: null]
# 啟用 hot-reload
--hot, -h     Enable hot-reload                     [boolean] [default: false]
# 序列化器
--serializer  Serializer                              [string] [default: null]
# 客製化 REPL 命令檔 mask
--commands    Custom REPL command file mask (e.g.: ./commands/*.js)
                                                      [string] [default: null]

Call

call 指令會連線到現有的 Moleculer 專案,然後夾帶參數來呼叫可用的 Action ,並將返回的 JSON 結果字串化印到主控台。這也意味著你可以透過其它工具來處理結果。夾帶的參數請加上 @ 前綴,若是 meta 參數請加上 # 前綴。

選項:

# 顯示版本號
--version          Show version number                               [boolean]
# 顯示說明
--help             Show help                                         [boolean]
# 由檔案讀取配置
--config, -c       Load configuration from a file       [string] [default: ""]
# Transporter 連線字串
--transporter, -t  Transporter connection string (NATS, nats://127.0.0.1:4222,
                   ...etc)                            [string] [default: null]
# 命名空間
--ns               Namespace                            [string] [default: ""]
# Log 等級
--level            Logging level                  [string] [default: "silent"]
# 節點 ID
--id               NodeID                             [string] [default: null]
# 序列化器
--serializer       Serializer                         [string] [default: null]

範例:夾帶參數與 meta 資訊

$ moleculer call math.add --transporter NATS --@a 5 --@b 3 --#meta-key MyMetaValue

範例:使用 jq[13] 處理結果

$ moleculer call "\$node.health" | jq '.mem.free'

範例:透過環境變數 TRANSPORTER 來設定 Transporter

$ TRANSPORTER=nats://localhost:42222 moleculer call math.add --@a 5 --@b 3

Emit

emit 指令會連線到現有的 Moleculer 專案,然後夾帶參數來發送可用的事件。夾帶的參數請加上 @ 前綴,若是 meta 參數請加上 # 前綴。

選項:

# 顯示版本號
--version          Show version number                               [boolean]
# 顯示說明
--help             Show help                                         [boolean]
# 由檔案讀取配置
--config, -c       Load configuration from a file       [string] [default: ""]
# Transporter 連線字串
--transporter, -t  Transporter connection string (NATS, nats://127.0.0.1:4222,
                   ...etc)                            [string] [default: null]
# 命名空間
--ns               Namespace                            [string] [default: ""]
# Log 等級
--level            Logging level                  [string] [default: "silent"]
# 節點 ID
--id               NodeID                             [string] [default: null]
# 序列化器
--serializer       Serializer                         [string] [default: null]
# 發送廣播事件
--broadcast, -b    Send broadcast event             [boolean] [default: false]
# 事件群組
--group, -g        Event groups                       [string] [default: null]

範例:夾帶參數與 meta 資訊

$ moleculer emit math.add --transporter NATS --@id 3 --@name John --#meta-key MyMetaValue

範例:廣播與群組

$ moleculer emit math.add --transporter NATS --broadcast --@id 3 --@name John --group accounts

範例:多個群組

$ moleculer emit math.add --transporter NATS --broadcast --@id 3 --@name John --group accounts --group mail

範例:透過環境變數 TRANSPORTER 來設定 Transporter

$ TRANSPORTER=nats://localhost:42222 moleculer call math.add --@a 5 --@b 3

參考文獻

[1] Command Line Tool, https://moleculer.services/docs/0.14/moleculer-cli.html
[2] Command line tool for Moleculer framework, https://github.com/moleculerjs/moleculer-cli
[3] Moleculer template: project, https://github.com/moleculerjs/moleculer-template-project
[4] moleculer-template topic, https://github.com/topics/moleculer-template
[5] Jest, https://jestjs.io/
[6] ESLint, https://eslint.org/
[7] Moleculer template: nano, https://github.com/moleculerjs/moleculer-template-nano
[8] moleculer-template-module, https://github.com/moleculerjs/moleculer-template-module
[9] download-git-repo, https://gitlab.com/flippidippi/download-git-repo
[10] Inquirer.js, https://github.com/SBoudrias/Inquirer.js#objects
[11] Metalsmith, https://github.com/metalsmith/metalsmith
[12] Handlebars, https://handlebarsjs.com/
[13] jq, https://stedolan.github.io/jq/

家家酒小劇場

  • Otter - CLI 工具是不是用了一次後就不太會再用了呢?
  • Boxy - 我在撰寫本系列文章時,需要建立許多基本的架構來撰寫範例,這種情況就很適合使用 CLI 工具來建立唷。

上一篇
Day 26 : 資料庫 Adapters
下一篇
Day 28 : REPL 主控台
系列文
Moleculer 家家酒31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言